

from info.models import User
from . import passport_bp
from flask import request, abort, make_response, jsonify, current_app, session
from info.utils.captcha.captcha import captcha
from info import redis_store, constants, db
from info.response_code import RET
import re
import random
from _datetime import datetime
from info.lib.yuntongxun.sms import CCP

@passport_bp.route('/login_out',methods=["POST"])
def login_out():
    # 删除session 中的键值对
    session.pop("user_id",None)
    session.pop("nick_name",None)
    session.pop("mobile",None)
    # 返回退出登录成功
    return jsonify(errno=RET.OK,errmsg="退出登录成功")



@passport_bp.route('/login',methods=["POST"])
def login():
    # 获取参数
    #mobile 手机号 passwo 密码
    mobile = request.json.get("mobile")
    password = request.json.get("password")

    # 检验参数：
        #非空判断
    if not all([mobile,password]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数不足")
        #手机号码格式判断
    if not re.match(r"1[3456789][0-9]{9}",mobile):
        return jsonify(errno=RET.PARAMERR,errmsg ="手机号码格式错误")


    #逻辑处理
        #根据手机号码查询当前用户对象
    user=None
    try:
        user = User.query.filter(User.mobile==mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="查询用户对象异常")

        #用户存在，进行密码对比
    if not user:
        return jsonify(errno = RET.DBERR,errmsg="用户不存在")
    if not user.check_passowrd(password):
        return jsonify(errno=RET.DATAERR,errmsg="密码填写错误")
        #修改最后一次登录时间
    user.last_login=datetime.now()
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg="用户属性异常")
        #登录成功记录用户信息
    session["nick_name"]=user.nick_name
    session["mobile"]=user.mobile
    session["user_id"]=user.id
    # 返回值
        # 登录成功
    return jsonify(errno=RET.OK,errmsg="登录成功")


@passport_bp.route('/register',methods=["POST"])
def register():
    param_dict=request.json
# 获取参数  获取手机号  获取密码 短信验证码
    mobile = param_dict.get("mobile")
    password = param_dict.get("password")
    sms_code = param_dict.get("sms_code")

# 参数检验  非空判断（判断手机号码,短信验证吗,密码）手机格式校验
    if not all([mobile,password,sms_code]):
        return jsonify(errno = RET.PARAMERR,errmsg="参数不足")
# 逻辑处理  根据 短信验证码 去redis中获取真实的短信的验证码  有值 从redis数据库删除 没有值：短信验验证码过期
#          拿用户填写的短信验证码和真实的短信验证码对比  不相等：提示前端  相等：创建用户对象，并给对应属性赋值,保存到数据库
#           注册成功一般表示登录成功，使用session保存用户基本信息
    if not re.match(r"1[3456789][0-9]{9}",mobile):
        return jsonify(errno=RET.PARAMERR,errmsg = "手机号码格式错误")
    try:
        real_sms_code = redis_store.get("SMS_%s" %mobile)
    except Exception as e:
        current_app.longer.error(e)
        return jsonify(errno=RET.DBERR,errmsg="查询短信验证码异常")
    if real_sms_code:
        redis_store.delete("SMS_%s" %mobile)
    else:
        return jsonify(errno=RET.NODATA,errmsg="短信验证码过期")
    if sms_code != real_sms_code:
        return jsonify(errno=RET.DATAERR,errmsg="短信验证码填写错误")
    user = User()
    user.nick_name = mobile
    user.mobile = mobile
    user.password = password

    user.last_login = datetime.now()
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg = "保存用户对象异常")
    session["nick_name"]=user.nick_name
    session["mobile"] = user.mobile
    session["user_id"]=user.id

    return jsonify(errno = RET.OK,errmsg="注册成功")

# 返回值      返回注册成功




# return jsonify()

@passport_bp.route('/sms_code',methods=['GET','POST'])
def send_sms_code():
    # 获取手机号码
    # 校验参数
    # 逻辑处理
    # 返回值
    param_dict = request.json
    mobile = param_dict.get("mobile")
    image_code = param_dict.get("image_code")
    image_code_id = param_dict.get("image_code_id")

    if not all([mobile,image_code,image_code_id]):
        return jsonify(errno = RET.PARAMERR,errmsg="参数不足")
    if not re.match(r"1[3456789]",mobile):
        return jsonify(errno = RET.PARAMERR,errmsg="手机号码格式错误")

    try:
        real_image_code = redis_store.get("imageCode_%s"% image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg = "查询图片验证码真实值数据异常")

    if real_image_code:
        redis_store.delete("imageCode_%s" %image_code_id)
    else:
        return jsonify(errno=RET.NODATA,errmsg = "图片验证码过期")

    if image_code.lower()!=real_image_code.lower():
        return jsonify(errno=RET.DATAERR,errmsg="图片验证码填写错误")
    try:
        user = User.query.filter(User.mobile ==mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(erro=RET.DBERR,errmsg="查询用户对象异常")
    if user:
        return jsonify(errno=RET.DATAEXIST,errmsg="用户手机号码已经注册")

    real_image_code = random.randint(0,99999)
    real_sms_code="%06d"%real_image_code
    ccp =CCP()
    try:
        result = ccp.send_template_sms(mobile,[real_sms_code,constants.SMS_CODE_REDIS_EXPIRES/60],1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg = "云通信发送短信雅正码异常")
    if result==-1:
        return jsonify(errno=RET.THIRDERR, errmsg="云通信发送短信雅正码异常")
    try:
        redis_store.setex("SMS_%s"%mobile,constants.SMS_CODE_REDIS_EXPIRES,real_sms_code)
    except Exception as e:
        return jsonify(errno=RET.DBERR,errmsg = "保存短信验证码值异常")
    return jsonify(errno=RET.OK,errmsg="发送短信验证码成功")
@passport_bp.route("/image_code")
def get_image_code():
    # 获取参数
    # 校验参数
    # 逻辑处理
    # 返回值
    code_id = request.args.get("code_id")
    if not code_id:
        return abort(404)
    image_name,real_image_code,image_data = captcha.generate_captcha()
    redis_store.setex("imageCode_%s"%code_id,constants.IMAGE_CODE_REDIS_EXPIRES,real_image_code)

    response = make_response(image_data)
    response.headers["Content-Type"] = "png/image"
    return response